package proxyTest.thread;

/**
 * @Author: jia
 * @Descirption:
 * @Date: 2018/5/17 14:13
 * @Modified By:
 */

public class TestThreadLocal {
    //每个线程可以使用多个ThreadLocal，多个线程也可以共享ThreadLocal对象，
    //ThreadLocal对象的弱引用就是每个线程所独有的ThreadLocalMap的key值。
    //当ThreadLocal对象不再使用时，这个key值就会被垃圾回收器回收，造成了
    //null-》Entry的强引用现象，因为垃圾回收器没有办法访问null为空的value，
    //所以jdk为了解决此问题，在getEntry方法中解决了此问题，但是前提条件是
    //必须得调用ThreadLocal的get或者set方法才能调用getEntry方法释放不必要
    //的对象。但这并不是我们必要的操作，所以我们需要手动的调用ThreadLocal的
    // remove方法就可以释放掉不必要的对象，但是问题又来了，要是ThreadLocal
    //对象已经不存在了呢，所以我们就需要将ThreadLocal对象定义成prite static final
    //生命周期变得更长，就可以解决此问题
    private static final ThreadLocal<Integer> value = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return 0;
        }

        @Override
        public Integer get() {
            return super.get();
        }

        @Override
        public void set(Integer value) {
            super.set(value);
        }

        @Override
        public void remove() {
            super.remove();
        }
    };

    public static void main(String[] args) {
        for (int i = 0; i < 50; i++) {
            new Thread(new MyThread(i)).start();
        }
    }

    static class MyThread implements Runnable {
        private int index;

        public MyThread(int index) {
            this.index = index;
        }

        @Override
        public void run() {
            System.out.println("线程" + index + "的初始value:" + value.get());
            for (int i = 0; i < 10; i++) {
                System.out.println(value);
                value.set(value.get() + i);
            }
            System.out.println("线程" + index + "的累加value:" + value.get());
        }
    }
}